package com.gxgeek.javabasic.base.valuepassed;

/**
 * Created by gx on 2017/7/10.
 */
public class FinalString {
    static String strc = "Hust";

    public static void main(String[] args) {
        /**
         * @String 是final类，因此不能修改原对象。当非要对他进行修改的时候，也并非是对原对象修改，而是重新创建一个对象
         * @str2 指向的还是原对象hust
         */
        String str1 = "Hust";
        String str2 = str1;
        str1 += str1;//此处，你以为你在修改值为hust的String对象，其实你只是在修改str变量的指向！
        System.out.println(str1);//HustHust
        System.out.println(str2);//Hust
        System.out.println(str1);//HustHust
        System.out.println(str2);//Hust
        final String str11 = "Hust";//比如此处str11被定义为final时，str11已经不允许被修改了
        StringB strv1 = new StringB();
        StringB strv2 = strv1;
        strv1.name += strv1.name;
        System.out.println(strv1.name);//Hust1Hust1
        System.out.println(strv2.name);//Hust1Hust1

        changestr(strc);

    }
    public static void changestr(String s) {
        /**
         * String传值本来是引用传递，下面的判断也可以印证！
         */
        System.out.println(s == strc);//true
        s = "HustHust";
        /**
         * 但是String是final的，对s进行修改，s会重新创建，s的指向不在是原来的strc，对s的修改也没有影响到原来strc，
         * 造成String传值的假象
         */
        System.out.println(s == strc);//false
    }
    public static void changestr1(final String s, final int v, int k,
                                  final StringB b) {

        /**
         * s,v的修改都是不允许，他们被定义为final，表示不允许修改。对s修改，则会重新创建String，对s重新指向。如果对v需改，
         * 则v会重现指向常量池地址
         */
        // s = "HustHust";
        // v = 300;
        k = 200;
        /**
         * 尽管b也被设置成final，但是对b.name的修改并不会影响b的指向，所以这种修改是允许的,一旦想要修改b的指向则会报错
         */
        b.name = "HustHust";
        // b = null;
    }

}

class StringB {
    String name = "Hust1";
}
